"""
会员服务类. 将一个服务, 封装成一个类.
服务名: MemberService  类名: MemberService
方法名: findByTelephone  方法名: find_by_telephone
"""
import json

from api.base_service import BaseService


class MemberService(BaseService):
    def __init__(self):
        # 重写: 子类中实现了父类的同名方法 我们现在就重写了init方法
        # 覆盖式重写: 子类重写父类方法, 将来调用时, 只调用子类的同名方法 --> 丢弃了父类的实现
        # 扩展式重写: 子类重写父类方法, 需要在合适的位置, 调用父类的方法, 然后在进行代码的扩展 --> 即实现了父类的, 也增加自己的
        super().__init__()  # 使用super, 调用父类的同名方法
        self.service_name = "MemberService"

    # 根据手机号查询会员服务  Member findByTelephone(String telephone)
    def find_by_telephone(self, tel):
        # 1. 调用接口
        resp = self.client.invoke(self.service_name, "findByTelephone", tel)

        # 2. 返回数据 --> 目前是字符串, 我们需要将字符串转换为对应的Python的数据类型, 只有是对应的Python类型, 才能做断言
        # 成功: "{'id': 'XX'}" 字典样式的字符串
        # 失败: "null"  手机号找不到   "14020210"
        # 失败: "Failed"  数据类型不对  14020210

        # 如果响应数据是null或者Failed, 就让接口返回None --> 调用接口时, 获得是None, 我们就知道接口调用失败了
        if resp == "null" or resp == "Failed":
            return None
        # 如果响应数据不是null或者Failed, 就让接口将字符串转换为对应的字典返回 --> 调用接口时, 获得是字典, 我们就可以进一步做断言了
        else:
            return json.loads(resp)  # load, 专门将文件对象, 转换为Python对象. loads, 专门将字符串, 转换为Python对象的


        # 根据日期统计会员数 List<Integer> findMemberCountByMonths(List<String> months)
    def find_member_count_by_months(self, data_list):
        # 1. 调用接口
        resp = self.client.invoke(self.service_name, "findMemberCountByMonths", data_list)

        # 2. 返回数据 失败的返回None, 成功的返回对应的Python数据类型
        # 成功: ["2021.8"] 返回对应月份的会员数 "[111]"
        # 失败: [2021.6] 返回 数据错误, 列表里不是字符串 "Failed"
        # 失败: "2021.6" 返回 数据类型错误不是列表 "No"
        if resp == "No" or resp == "Failed":
            return None
        else:
            return json.loads(resp)


# 添加会员 void add(Member member)
    def add(self, member_dict):
        # 1. 调用接口
        # Member是一个自定义的类型, 需要我们使用字典来传递, 并增加class字段信息.
        # 为了传参方便, 将class字段, 封装到方法里即可
        # 给字典增加class字段信息 字典增加或修改的语法: 字典[键] = 值. 如果键存在, 就修改, 如果键不存在, 就新增
        member_dict["class"] = "com.itheima.pojo.Member"
        resp = self.client.invoke(self.service_name, "add", member_dict)

        # 2. 返回数据 添加会员接口没有需要转换的数据 --> 失败 返回False  成功 True 根据True和False来判断接口是否调用成功
        # 成功: 字符串 "null"
        # 失败: 字符串 "Failed"  手机号重复, 或者错误
        # 失败: 字符串 "No" 缺少class字段信息
        if resp == "null":
            return True
        else:
            return False


if __name__ == '__main__':
    # 创建对象
    ms = MemberService()

    # 调用 根据手机号查询会员服务 方法
    res = ms.find_by_telephone("14020210001")
    print("响应类型", type(res))
    print("响应数据", res)

    print("*" * 50)
    # 调用 根据日期统计会员数 方法
    res = ms.find_member_count_by_months(["2021.6", "2022.5"])
    print("响应类型", type(res))
    print("响应数据", res)

    print("*" * 50)
    # 调用 添加会员 方法
    member_dict = {"name": "惠主播", "phoneNumber": "14020220007"}
    res = ms.add(member_dict)
    print("响应类型", type(res))
    print("响应数据", res)
